import axios from "axios"
import { ElLoading } from 'element-plus';
import { ElMessage } from 'element-plus';
import store from "../store/index.js"
import router from "@/router/index.js";

//使用create创建axios实例
let loadingObj=null
//loadingObj设置成全局的原因：在请求拦截里打开，在响应拦截里关闭

//Service()是异步方法，所以get等请求方法是异步的，所以get().then
//get({xxx})=goodsListApi(data.searchParams)
const Service=axios.create({
    timeout:8000,  //单位是毫秒
    baseURL:"http://127.0.0.1:8888/api/private/v1/",
    headers:{
        // "Centent-Type":"application/json"
        //state 存在全局用户信息
        "Authorization":store.state.uInfo.userInfo.token
    
    }
})
    //请求拦截-增加loading等，对请求做统一处理
    Service.interceptors.request.use(config=>{
        //接收到了函数的config参数，但是不对他做任何处理，并将config返回
        loadingObj=ElLoading.service({
            lock:true,//锁定，页面不可以做其他操作
            text:'Loading',
            background:'rgba(0,0,0,0.7',
        })
        return config
        //config形参，按这个套路用就行了
    })
    //响应拦截-对返回值做统一处理
    Service.interceptors.response.use(response=>{
        //调用use方法，把一个函数作为参数传入。这个函数的参数response接收了响应值，并且做了一系列的处理。
        loadingObj.close()
        const data=response.data
        console.log("返回值",response)
        if(data.meta.status!=200 && data.meta.status!=201){
            //判断token失效后 跳转登录页
        if(data.meta.msg == '无效token'){
            ElMessage.error("token已失效，请重新重录")
            console.log("跳转登录页")//用来验证有没有执行到这一行
            //如果会触发路由守卫，会进入死循环  //但replace不触发路由路由守卫  但push会触发
            router.replace('/login');
            return data
        }
            ElMessage.error(data.meta.msg||"服务器错误")
            //请求出错          
            return data
        }
        
        return data
    },error=>{
        loadingObj.close()
        ElMessage({
            message:"服务器错误",
            type:"error",
            duration:2000
        })
})

//post请求
export const post=config=>{
    return Service({
        ...config,
        method:"post",
        data:config.data
    })
}

//get请求
export const get=config=>{
    return Service({
        //Service是上面所定义的axios实例
        //实例（）是一个方法
        //实例.xxx（）也是一个方法

        ...config,//扩展语法
        // //config是形参，接收调用get方法时传入的参数
        method:"get",
        params:config.data

        //方法    url路径（config接收）    data(config接收)(调用Api请求时传入的)       请求头（在Service实例中包含）
    })
}

//put请求
export const put=config=>{
    return Service({
        ...config,
        method:"put",
        data:config.data
    })
}

//delete
export const del=config=>{
    return Service({
        ...config,
        method:"delete",
    })
}
    


